#include "sqlist.h"
#include <stdio.h>
#include <stdlib.h>

/**
 * @brief 创建线性表
 * 
 * @details 创建线性表，分配内存。 
 * @return 线性表结构体指针,失败返回空指针NULL
 * 
 */
sqlist *sqlist_create(void)
{
    sqlist *me;

    me = malloc(sizeof(*me));
    if(me == NULL)
        return NULL;

    me->last = -1;  //线性表中数据为空时，last为-1。
    
    return me;
}

/**
 * @brief 创建线性表
 * 
 * @details 利用二级指针传参，把其一级目标进行初始化。
 * @param ptr [IN]线性表二级指针
 */
void sqlist_init(sqlist **ptr)
{
    *ptr = malloc(sizeof(**ptr));
    if(*ptr == NULL)
        return;
    
    (*ptr)->last = -1;
    return ;
}


/**
 * @brief 线性表插入数据
 * 
 * @param me    [IN]线性表指针
 * @param i     [IN]下标
 * @param data  [IN]插入的数据
 * @return int 0-OK !0-Err
 */
int sqlist_insert(sqlist *me,int i,datatype *data)
{
    int j;

    if(me->last == DATASIZE -1)
        return -1; //线性表满
    
    if( (i < 0) || (i > me->last+1))
        return -2; //线性存储,不能越过空间存储，判断插入位置下标合法性。

    // 平移其他数据
    for(j = me->last;i<=j;j--)
        me->data[j+1] =  me->data[j];

    // 插入数据
    me->data[i] = *data; //常用数据赋值，其他赋值可能会用memcpy。
    me->last++;
    return 0;
}


/**
 * @brief 删除线性表指定下标的元素
 * 
 * @param me    [IN]线性表指针
 * @param i     [IN]要删除元素的下标
 * @return int 0-OK !0-Err.
 */
int sqlist_delete(sqlist *me,int i)
{

    int k;

    if((i<0) || (i > me->last))
        return -1; //下标错误

    for(k=i;k<me->last;k++)
        me->data[k] = me->data[k+1];

    // for(k=i+1;k<=me->last;k++)
    //     me->data[k-1] = me->data[k];
    
    me->last --;

    return 0;
}

/**
 * @brief 查找线性表指定元素的下标
 * 
 * @details 线性表下标从0开始。
 * @param me    [IN]线性表指针
 * @param data  [IN]线性表元素指针
 * @return int  找到的第一个元素的下标，以0开始。若未找到则-1.
 */
int sqlist_find(sqlist *me, datatype *data)
{
    int i;

    if(sqlist_isempty(me) == 0)
        return -1; //线性表为空

    for(i=0;i<=me->last;i++)
    {
        if(me->data[i] == *data)
        {
            return i;
        }
    }

    return -2; //未找到
}

/**
 * @brief 线性表强制清空数据。
 * 
 * @param me    [IN]线性表指针
 * @return int 0-OK !0-Err.
 */
int sqlist_setempty(sqlist *me)
{
    me->last = -1;
    return 0;
}


/**
 * @brief 获取线性表元素个数
 * 
 * @param me [IN]线性表指针
 * @return int 线性表元素个数
 */
int sqlist_getnum(sqlist *me)
{
    return (me->last + 1);
}

/**
 * @brief 返回线性表是否为空
 * 
 * @param me    [IN]线性表指针
 * @return int 0-空 !0-非空
 */
int sqlist_isempty(sqlist *me)
{
    if(me->last == -1)
        return 0;
    
    return -1;
}

/**
 * @brief 遍历线性表
 * 
 * @param me [IN]线性表指针
 */
void sqlist_display(sqlist *me)
{
    int i;

    if(me->last == -1)
        return;
    
    for(i = 0; i <= me->last ; i++)
    {
        printf("%d ",me->data[i]);
    }
    printf("\n");

    return;
}

/**
 * @brief 销毁线性表
 * 
 * @details 释放线性表内存
 * @param me [IN]线性表指针
 * @return int 0-OK !0=Err
 */
int sqlist_destroy(sqlist *me)
{
    free(me);
    return 0;
}

/**
 * @brief 线性表合并
 * 
 * @details 将list2中与list1不同的数据合并到list1中,
 * @param list1 [IN]线性表指针
 * @param list2 [IN]线性表指针
 * @return int 0-OK !0-Err
 */
int sqlist_union(sqlist *list1,sqlist *list2)
{
    int i= 0;

    for(i=0;i<=list2->last;i++)
    {
        if(sqlist_find(list1,&(list2->data[i])) < 0)
        {
            sqlist_insert(list1,0,&list2->data[i]);
        }
    }
    
    return 0;
}